package com.hoppinzq.algorithm.graph;

import com.hoppinzq.algorithm.stackAndQueue.MyQueue;

/**
 * 5
 * 有向图：有向图的边是有方向的
 */
public class MyDigraph {
    private final int V;//顶点数
    private int E;//边数
    private MyQueue<Integer>[] queue;//邻接表

    public MyDigraph(int v){
        this.V=v;
        this.E=0;
        this.queue=new MyQueue[v];
        for(int i=0;i<v;i++){
            queue[i]=new MyQueue<>();
        }
    }

    /**
     * 返回顶点的个数
     * @return
     */
    public int V(){
        return V;
    }

    /**
     * 返回边的个数
     * @return
     */
    public int E(){
        return E;
    }

    /**
     * 为两个顶点添加边,方向是v-->w
     * @param v
     * @param w
     */
    public void addEdge(int v,int w){
        this.queue[v].enQueue(w);
        E++;
    }

    /**
     * 返回指定顶点所有的相邻顶点
     * @param v
     * @return
     */
    public MyQueue getQueue(int v){
        return queue[v];
    }

    /**
     * 返回该图的反向图
     * @return
     */
    private MyDigraph reverse(){
        MyDigraph digraphR=new MyDigraph(V);
        for(int v=0;v<V;v++){
            MyQueue<Integer> myQueue=queue[v];
            for (Integer i : myQueue) {
                digraphR.addEdge(i,v);
            }
        }
        return digraphR;
    }
}
